package cn.good.yan.b12.t3;

import cn.good.yan.b12.t1.T1;
import sun.rmi.runtime.Log;

import java.util.ArrayList;
import java.util.Date;

/**
 * b12 泛型
 *      案例3
 *      泛型上下边界
 * @author shengren.yan
 * @create 2023-07-30
 */
//public class T3 <T> {
// 这么写 该通配符 必须是 Number 的子类
public class T3 <T extends Number> {

    private T key;

    public T3(T key) {
        this.key = key;
    }
    public T getKey(){
        return key;
    }


    // 使用
    public static void main(String[] args) {
        T3<Integer> t1 = new T3<Integer>(123456);
        //  测试 , <? extends Number>
        // 如果这么定义 public class T3 <T extends Number>  下面的会报红
//        T3<Date> t2 = new T3<Date>(new Date());
//        T3<String> t3 = new T3<String>("abc");
        T3<Float> t4 = new T3<Float>(3.4f);

        T3ALl aLl = new T3ALl();
//        aLl.showKeyValue1(t1);
        // 此时会报红，因为 Date 和 String 不是 Number 的子类
//        aLl.showKeyValue1(t2);
//        aLl.showKeyValue1(t4);

        // 测试 , <? super Number>  往当前元素添加元素
        ArrayList<Object> objects = new ArrayList<>();
        aLl.showKeyValue2(objects);
        System.out.println(objects);
        // <? extends T>与<? super T> 对比
        // 对于<? extends 类型>，编译器将只允许读操作，不允许写操作。即只可以取值，不可以设值
        // 对于<? super 类型>，编译器将只允许写操作，不允许读操作。即只可以设值（比如 set 操作）
    }


}

//
class T3ALl {

    // ? 是通配符，但这个通配符必须是 Number 的子类， Number 是父类
    public void showKeyValue1(T3<? extends Number> obj) {
        System.out.println("泛型测试" + obj.getKey());
    }

    // ? 是通配符，返回結果，也必須是 Number 的子类
    public <T extends Number> T showKeyName(T3<T> container) {
        System.out.println("container key :" + container.getKey());
        T test = container.getKey();
        return test;
    }

    // ? 是通配符，但这个通配符必须是 Number 的子类， Number 是父类
    public void showKeyValue2(ArrayList<? super Number> obj) {
        obj.add(new Integer(0));
        obj.add(new Float(1.0));
    }
}
